package de.fhluebeck.oop.gps.ws;

import java.util.ArrayList;
import java.util.List;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.fhluebeck.oop.gps.common.Constants;
import de.fhluebeck.oop.gps.common.DependencyManager;
import de.fhluebeck.oop.gps.entity.Category;
import de.fhluebeck.oop.gps.entity.Poi;
import de.fhluebeck.oop.gps.service.IPoiService;
import de.fhluebeck.oop.gps.ws.api.CategoryWTO;
import de.fhluebeck.oop.gps.ws.api.PoiWTO;

/**
 * WebService Interface 
 * 
 * In diesem Interface gibt es eine Operation die zur Verfügung gestellt wird. 
 * Die Operation delegiert den Aufruf weiter an den PoiService, der die Daten selektiert
 * und zurückliefert. Diese Daten werden dann aus den Datenbankentitäten ausgelesen und in 
 * Webservice Transfer Objekte transformiert und dem WS-Stack übergeben
 * 
 * @author Ogün Bilge, Leif Hitzschke
 * @version 1.00, 13.11.2009
 * 
 */
@WebService(serviceName = "PoiService", targetNamespace = Constants.targetNamespace, name = "PoiService", portName = "PoiService_Port")
public class WSPoiService {

	private final IPoiService poiService ;
	private final static Logger log = LoggerFactory.getLogger(WSPoiService.class);
	public WSPoiService() {
		super();
		this.poiService = (IPoiService) DependencyManager.locate(Constants.POI_SERVICE_DEP_NAME);
	}

	@WebMethod
	public @WebResult(name = "poi", targetNamespace = Constants.targetNamespace)
	List<PoiWTO> getPoiList(
			@WebParam(name = "tel", targetNamespace = Constants.targetNamespace) String tel,
			@WebParam(name = "lat", targetNamespace = Constants.targetNamespace) String lat,
			@WebParam(name = "lng", targetNamespace = Constants.targetNamespace) String lng) {
		
		List<Poi> pois = poiService.readAll();
		List<PoiWTO> response = new ArrayList<PoiWTO>() ;
		for (Poi poi : pois) {
			PoiWTO entry = new PoiWTO();
			entry.setId(poi.getId());
			entry.setDescription(poi.getDescription());
			entry.setLat(poi.getLat());
			entry.setLng(poi.getLng());
			entry.setName(poi.getName());
			
			Category category = poi.getCategory();
			CategoryWTO categoryWTO = new CategoryWTO();
			categoryWTO.setId(category.getId());
			categoryWTO.setName(category.getName());
			
			entry.setCategory(categoryWTO);
			response.add(entry);
		}
		log.debug("return response for ws {}" , response);
		
		return response;
	}

}
